﻿#region Using

using System;
using System.Web;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Asah.SiteWorx.BlogEngine.Core;

#endregion

public partial class Blog_Archive : Asah.SiteWorx.BlogEngine.Core.Web.Controls.BlogBasePage
{
    /// <summary>
    /// Handles the Load event of the Page control.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack && !IsCallback)
        {
            CreateMenu();
            CreateArchive();
            AddTotals();
        }

        Page.Title = Server.HtmlEncode(Resources.labels.archive);
        base.AddMetaTag("description", Resources.labels.archive + " | " + BlogSettings.Instance.Name);
    }

    /// <summary>
    /// Creates the category top menu.
    /// </summary>
    private void CreateMenu()
    {
        foreach (Category cat in Category.Categories)
        {
            AddCategoryToMenu(cat.Title);
        }
    }

    private void AddCategoryToMenu(string title)
    {
        HtmlAnchor a = new HtmlAnchor();
        a.InnerHtml = Server.HtmlEncode(title);
        a.HRef = "#" + Utils.RemoveIllegalCharacters(title);
        a.Attributes.Add("rel", "directory");

        HtmlGenericControl li = new HtmlGenericControl("li");
        li.Controls.Add(a);
        ulMenu.Controls.Add(li);
    }

    /// <summary>
    /// Sorts the categories.
    /// </summary>
    /// <param name="categories">The categories.</param>
    private SortedDictionary<string, Guid> SortCategories(Dictionary<Guid, string> categories)
    {
        SortedDictionary<string, Guid> dic = new SortedDictionary<string, Guid>();
        foreach (Category cat in Category.Categories)
        {
            dic.Add(cat.Title, cat.Id);
        }

        return dic;
    }

    private void CreateArchive()
    {
        foreach (Category cat in Category.Categories)
        {
            string name = cat.Title;
            List<Post> list = Post.GetPostsByCategory(cat.Id).FindAll(delegate(Post p) { return p.IsVisible; });

            HtmlGenericControl h2 = CreateRowHeader(cat.Id, name, list.Count);
            phArchive.Controls.Add(h2);

            HtmlTable table = CreateTable(name);
            foreach (Post post in list)
            {
                CreateTableRow(table, post);
            }

            phArchive.Controls.Add(table);
        }

        List<Post> noCatList = Post.Posts.FindAll(delegate(Post p) { return p.Categories.Count == 0; });
        if (noCatList.Count > 0)
        {
            string name = Resources.labels.uncategorized;
            HtmlGenericControl h2 = CreateRowHeader(Guid.NewGuid(), name, noCatList.Count);
            phArchive.Controls.Add(h2);

            HtmlTable table = CreateTable(name);
            foreach (Post post in noCatList)
            {
                CreateTableRow(table, post);
            }

            phArchive.Controls.Add(table);

            AddCategoryToMenu(name);
        }
    }

    private static HtmlGenericControl CreateRowHeader(Guid id, string name, int count)
    {
        HtmlAnchor feed = new HtmlAnchor();
        feed.HRef = Utils.RelativeWebRoot + "category/syndication.axd?category=" + id.ToString();

        HtmlImage img = new HtmlImage();
        img.Src = Utils.RelativeWebRoot + "pics/rssbutton.gif";
        img.Alt = "RSS";

        feed.Controls.Add(img);

        HtmlGenericControl h2 = new HtmlGenericControl("h2");
        h2.Attributes["id"] = Utils.RemoveIllegalCharacters(name);
        h2.Controls.Add(feed);

        Control header = new LiteralControl(name + " (" + count + ")");
        h2.Controls.Add(header);
        return h2;
    }

    private static void CreateTableRow(HtmlTable table, Post post)
    {
        HtmlTableRow row = new HtmlTableRow();

        HtmlTableCell date = new HtmlTableCell();
        date.InnerHtml = post.DateCreated.ToString("yyyy-MM-dd");
        date.Attributes.Add("class", "date");
        row.Cells.Add(date);

        HtmlTableCell title = new HtmlTableCell();
        title.InnerHtml = string.Format("<a href=\"{0}\">{1}</a>", post.RelativeLink, post.Title);
        title.Attributes.Add("class", "title");
        row.Cells.Add(title);

        if (BlogSettings.Instance.IsCommentsEnabled)
        {
            HtmlTableCell comments = new HtmlTableCell();
            comments.InnerHtml = post.ApprovedComments.Count.ToString();
            comments.Attributes.Add("class", "comments");
            row.Cells.Add(comments);
        }

        if (BlogSettings.Instance.EnableRating)
        {
            HtmlTableCell rating = new HtmlTableCell();
            rating.InnerHtml = post.Raters == 0 ? "None" : Math.Round(post.Rating, 1).ToString();
            rating.Attributes.Add("class", "rating");
            row.Cells.Add(rating);
        }

        table.Rows.Add(row);
    }

    private HtmlTable CreateTable(string name)
    {
        HtmlTable table = new HtmlTable();
        table.Attributes.Add("summary", name);

        HtmlTableRow header = new HtmlTableRow();

        HtmlTableCell date = new HtmlTableCell("th");
        date.InnerHtml = base.Translate("date");
        header.Cells.Add(date);

        HtmlTableCell title = new HtmlTableCell("th");
        title.InnerHtml = base.Translate("title");
        header.Cells.Add(title);

        if (BlogSettings.Instance.IsCommentsEnabled)
        {
            HtmlTableCell comments = new HtmlTableCell("th");
            comments.InnerHtml = base.Translate("comments");
            comments.Attributes.Add("class", "comments");
            header.Cells.Add(comments);
        }

        if (BlogSettings.Instance.EnableRating)
        {
            HtmlTableCell rating = new HtmlTableCell("th");
            rating.InnerHtml = base.Translate("rating");
            rating.Attributes.Add("class", "rating");
            header.Cells.Add(rating);
        }

        table.Rows.Add(header);

        return table;
    }

    private void AddTotals()
    {
        int comments = 0;
        int raters = 0;
        foreach (Post post in Post.Posts)
        {
            comments += post.ApprovedComments.Count;
            raters += post.Raters;
        }

        ltPosts.Text = Post.Posts.Count + " " + Resources.labels.posts.ToLowerInvariant();
        if (BlogSettings.Instance.IsCommentsEnabled)
            ltComments.Text = comments + " " + Resources.labels.comments.ToLowerInvariant();

        if (BlogSettings.Instance.EnableRating)
            ltRaters.Text = raters + " " + Resources.labels.raters.ToLowerInvariant();
    }
}
